java泛型通配符?未限定使用时和原生类型都可以表示任意类型,区别何在?
关于 Set<?> 的事实:
1. 因为集合被 ? 标注,故Set<?> 可容纳任意类型;
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public static void main(String[] args) { HashSet<Integer> s1 = new HashSet<Integer>(Arrays.asList(1, 2, 3)); printSet(s1); HashSet<String> s2 = new HashSet<String>(Arrays.asList("a", "b", "c")); printSet(s2); } public static void printSet(Set<?> s) { for (Object o : s) { System.out.println(o); } }
|
2. 因为不知道 ?代表那种类型,所有我们不能往 Set<?> 中添加任何元素(除了null);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public static void printSet(Set<?> s) { s.add(10); for (Object o : s) { System.out.println(o); } } public static void printSet(Set s) { s.add("2"); for (Object o : s) { System.out.println(o); } } Set<?> set = new HashSet<?>();
|
综上:都可以代表任意元素,但添加动作仅限于原生类型,通配符限定一般用于形参。使用泛型可以保证类型安全,原生类型无法保证;